package blue.global.tree;

import java.util.List;

/**
 * 树的根接口
 * 
 * @param <T> 树的节点项类型，必须实现 ITreeNodeItem 接口
 * @author zhengj
 * @since 1.0
 */
public interface ITree<T extends ITreeNodeItem>
{
	/**
	 * 把一个节点项添加到当前树中<br>
	 * 具有相同节点项的 getNo() 不会添加到当前树中<br>
	 * 
	 * @param item 节点
	 */
	void add(T item);

	/**
	 * 把一组节点项列表添加到当前树中<br>
	 * 具有相同节点项的 getNo() 不会添加到当前树中<br>
	 * <b>注：这组节点项列表必须按节点的 getNo() 升序排序</b>
	 * 
	 * @param itemList 节点项列表
	 */
	void add(List<T> itemList);

	/**
	 * 把一组节点项列表添加到当前树中<br>
	 * 具有相同节点项的 getNo() 不会添加到当前树中<br>
	 * <b>注：在添加到当前树之前会先按节点项的 getNo() 升序排序</b>
	 * 
	 * @param itemList 节点项列表
	 */
	void orderAndAdd(List<T> itemList);

	/**
	 * 遍历树<br>
	 * 二叉树遍历可分为先序遍历、中序遍历、后序遍历<br>
	 * 一般树遍历可分为深度优先遍历、层次优先遍历
	 * 
	 * @param visit 遍历树时的动作
	 */
	void traverse(IVisitable visit);
	
	/**
	 * 取得树的根节点<br>
	 * 
	 * @return 树的根节点，不存在返回 null
	 */
	T getRoot();
}
